<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"
    />
    <meta
      name="description"
      content="Configure viewer to add a button enabling look at a mobile device with cardboard."
    />
    <meta name="quarkgis-sandcastle-labels" content="Beginner, Showcases" />
    <title>QuarkGIS Demo</title>
    <script type="text/javascript" src="../Sandcastle-header.js"></script>
    <script
      type="text/javascript"
      src="../../../Build/QuarkGISUnminified/QuarkGIS.js"
      nomodule
    ></script>
    <script type="module" src="../load-quarkgis-es6.js"></script>
  </head>
  <body
    class="sandcastle-loading"
    data-sandcastle-bucket="bucket-requirejs.html"
  >
    <style>
      @import url(../templates/bucket.css);
    </style>
    <div id="quarkgisContainer" class="fullSize"></div>
    <div id="loadingOverlay"><h1>Loading...</h1></div>
    <div id="toolbar"></div>
    <script id="quarkgis_sandcastle_script">
      function startup(QuarkGIS) {
        "use strict";
        //Sandcastle_Begin
        var viewer = new QuarkGIS.Viewer("quarkgisContainer", {
          vrButton: true,
          terrainProvider: QuarkGIS.createWorldTerrain(),
        });
        // Click the VR button in the bottom right of the screen to switch to VR mode.

        viewer.scene.globe.enableLighting = true;
        viewer.scene.globe.depthTestAgainstTerrain = true;

        // Follow the path of a plane. See the interpolation Sandcastle example.
        QuarkGIS.Math.setRandomNumberSeed(3);

        var start = QuarkGIS.JulianDate.fromDate(new Date(2015, 2, 25, 16));
        var stop = QuarkGIS.JulianDate.addSeconds(
          start,
          360,
          new QuarkGIS.JulianDate()
        );

        viewer.clock.startTime = start.clone();
        viewer.clock.stopTime = stop.clone();
        viewer.clock.currentTime = start.clone();
        viewer.clock.clockRange = QuarkGIS.ClockRange.LOOP_STOP;
        viewer.clock.multiplier = 1.0;
        viewer.clock.shouldAnimate = true;

        function computeCirclularFlight(lon, lat, radius) {
          var property = new QuarkGIS.SampledPositionProperty();
          var startAngle = QuarkGIS.Math.nextRandomNumber() * 360.0;
          var endAngle = startAngle + 360.0;

          var increment =
            (QuarkGIS.Math.nextRandomNumber() * 2.0 - 1.0) * 10.0 + 45.0;
          for (var i = startAngle; i < endAngle; i += increment) {
            var radians = QuarkGIS.Math.toRadians(i);
            var timeIncrement = i - startAngle;
            var time = QuarkGIS.JulianDate.addSeconds(
              start,
              timeIncrement,
              new QuarkGIS.JulianDate()
            );
            var position = QuarkGIS.Cartesian3.fromDegrees(
              lon + radius * 1.5 * Math.cos(radians),
              lat + radius * Math.sin(radians),
              QuarkGIS.Math.nextRandomNumber() * 500 + 1800
            );
            property.addSample(time, position);
          }
          return property;
        }

        var longitude = -112.110693;
        var latitude = 36.0994841;
        var radius = 0.03;

        var modelURI =
          "../../SampleData/models/QuarkGISBalloon/QuarkGISBalloon.glb";
        var entity = viewer.entities.add({
          availability: new QuarkGIS.TimeIntervalCollection([
            new QuarkGIS.TimeInterval({
              start: start,
              stop: stop,
            }),
          ]),
          position: computeCirclularFlight(longitude, latitude, radius),
          model: {
            uri: modelURI,
            minimumPixelSize: 64,
          },
        });

        entity.position.setInterpolationOptions({
          interpolationDegree: 2,
          interpolationAlgorithm: QuarkGIS.HermitePolynomialApproximation,
        });

        // Set initial camera position and orientation to be when in the model's reference frame.
        var camera = viewer.camera;
        camera.position = new QuarkGIS.Cartesian3(0.25, 0.0, 0.0);
        camera.direction = new QuarkGIS.Cartesian3(1.0, 0.0, 0.0);
        camera.up = new QuarkGIS.Cartesian3(0.0, 0.0, 1.0);
        camera.right = new QuarkGIS.Cartesian3(0.0, -1.0, 0.0);

        viewer.scene.postUpdate.addEventListener(function (scene, time) {
          var position = entity.position.getValue(time);
          if (!QuarkGIS.defined(position)) {
            return;
          }

          var transform;
          if (!QuarkGIS.defined(entity.orientation)) {
            transform = QuarkGIS.Transforms.eastNorthUpToFixedFrame(position);
          } else {
            var orientation = entity.orientation.getValue(time);
            if (!QuarkGIS.defined(orientation)) {
              return;
            }

            transform = QuarkGIS.Matrix4.fromRotationTranslation(
              QuarkGIS.Matrix3.fromQuaternion(orientation),
              position
            );
          }

          // Save camera state
          var offset = QuarkGIS.Cartesian3.clone(camera.position);
          var direction = QuarkGIS.Cartesian3.clone(camera.direction);
          var up = QuarkGIS.Cartesian3.clone(camera.up);

          // Set camera to be in model's reference frame.
          camera.lookAtTransform(transform);

          // Reset the camera state to the saved state so it appears fixed in the model's frame.
          QuarkGIS.Cartesian3.clone(offset, camera.position);
          QuarkGIS.Cartesian3.clone(direction, camera.direction);
          QuarkGIS.Cartesian3.clone(up, camera.up);
          QuarkGIS.Cartesian3.cross(direction, up, camera.right);
        });

        // Add a few more balloons flying with the one the viewer is in.
        var numBalloons = 12;
        for (var i = 0; i < numBalloons; ++i) {
          var balloonRadius =
            (QuarkGIS.Math.nextRandomNumber() * 2.0 - 1.0) * 0.01 + radius;
          var balloon = viewer.entities.add({
            availability: new QuarkGIS.TimeIntervalCollection([
              new QuarkGIS.TimeInterval({
                start: start,
                stop: stop,
              }),
            ]),
            position: computeCirclularFlight(
              longitude,
              latitude,
              balloonRadius
            ),
            model: {
              uri: modelURI,
              minimumPixelSize: 64,
            },
          });

          balloon.position.setInterpolationOptions({
            interpolationDegree: 2,
            interpolationAlgorithm: QuarkGIS.HermitePolynomialApproximation,
          });
        }

        //Sandcastle_End
        Sandcastle.finishedLoading();
      }
      if (typeof QuarkGIS !== "undefined") {
        window.startupCalled = true;
        startup(QuarkGIS);
      }
    </script>
  </body>
</html>
